home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / DEMON / LANGUAGE / POTSRC.ARC / src / mod / coco < prev    next >
Text File  |  1995-01-22  |  4KB  |  131 lines

  1. MODULE COCO; (* DVD 04 09 1993 00:12 *)
  2.   IMPORT Files, Strings, COCS;  (* to mark *)
  3.   (* C Output *)
  4.   CONST
  5.     UnxNL = 0AX;  MacNL = 0DX;
  6.     IndWidth = 2;
  7.         CLineLength = 80;
  8.  
  9.   VAR
  10.     fold*, linenum*, macwrap*, unxwrap*: BOOLEAN;
  11.     NL: ARRAY 2 OF CHAR;
  12.     NLlen: INTEGER;
  13.     ofile: Files.File;
  14.     Output: Files.Rider;
  15.     indlevel: INTEGER;
  16.     newline: BOOLEAN;
  17.     txtline: LONGINT;
  18.         cpos: INTEGER;
  19.  
  20.   PROCEDURE Size*(): LONGINT;
  21.   BEGIN RETURN Files.Pos(Output) + 1
  22.   END Size;
  23.  
  24.   PROCEDURE Open*(VAR name: ARRAY OF CHAR);
  25.   BEGIN  ofile := Files.New(name); IF ofile = NIL THEN HALT(21H) END; 
  26.     Files.Set(Output,ofile,0);
  27.     indlevel := 0; txtline := 1; newline := TRUE; cpos := 0;
  28.     NLlen := 0;
  29.     IF macwrap THEN NL[NLlen] := MacNL; INC(NLlen) END;
  30.     IF unxwrap THEN NL[NLlen] := UnxNL; INC(NLlen) END;
  31.     IF NLlen = 0 THEN NL[NLlen] := UnxNL; INC(NLlen) END
  32.   END Open;
  33.  
  34.   PROCEDURE Close*;
  35.   BEGIN Files.Set(Output, NIL, 0); Files.Close(ofile)
  36.   END Close;
  37.  
  38.   PROCEDURE Purge*;
  39.   BEGIN Files.Set(Output, NIL, 0); Files.Purge(ofile)
  40.   END Purge; 
  41.  
  42.   PROCEDURE Indent*;
  43.   BEGIN INC(indlevel, IndWidth)
  44.   END Indent;
  45.  
  46.   PROCEDURE Undent*;
  47.   BEGIN IF indlevel >= IndWidth THEN DEC(indlevel, IndWidth) END
  48.   END Undent;
  49.  
  50.   PROCEDURE Separate*;
  51.   BEGIN Files.Write(Output, " ");
  52.   END Separate;
  53.  
  54.   PROCEDURE Wrap*;
  55.     VAR i: INTEGER;
  56.       linepgm: ARRAY 7 OF CHAR;
  57.       lineno: ARRAY 11 OF CHAR;
  58.   BEGIN
  59.     newline := TRUE;
  60.     Files.WriteBytes(Output, NL, NLlen);
  61.     IF linenum & (txtline # COCS.txtpos.line) THEN
  62.       linepgm := "#line "; 
  63.       Strings.FromLInt(COCS.txtpos.line, 10, lineno);
  64.       Files.WriteBytes(Output, linepgm, Strings.Length(linepgm));
  65.       Files.WriteBytes(Output, lineno, Strings.Length(lineno));
  66.       Files.Write(Output, " "); Files.Write(Output, 22X); 
  67.       Files.WriteBytes(Output, COCS.txtpos.name, Strings.Length(COCS.txtpos.name)); 
  68.       Files.Write(Output, 22X); Files.WriteBytes(Output, NL, NLlen);
  69.       txtline := COCS.txtpos.line
  70.     END;
  71.     INC(txtline)
  72.   END Wrap;
  73.  
  74.   PROCEDURE PutSeq*(s: ARRAY OF CHAR);
  75.     VAR i, j: INTEGER;
  76.   BEGIN 
  77.     IF newline THEN
  78.       newline := FALSE; i := 0; 
  79.       WHILE i # indlevel DO Files.Write(Output, " "); INC(i) END;
  80.             cpos := i
  81.     END;  
  82.     i := 0; j := 0; WHILE s[i] = " " DO INC(i) END;
  83.         IF fold THEN
  84.             LOOP
  85.              IF i # j THEN s[j] := s[i] END;
  86.                 IF s[j] = 0X THEN EXIT END;
  87.                 INC(i); INC(j);
  88.                 IF (cpos >= CLineLength) & ((s[i] = "(") OR (s[i] = ")")) THEN
  89.                 Files.WriteBytes(Output, s, j);
  90.                     Files.Write(Output, "\"); Files.WriteBytes(Output, NL, NLlen);
  91.                     j := 0; cpos := 0
  92.                 ELSE INC(cpos)
  93.                 END
  94.         END
  95.         ELSIF i # j THEN
  96.             LOOP s[j] := s[i]; IF s[j] = 0X THEN EXIT END;
  97.                 INC(i); INC(j)
  98.             END
  99.         ELSE j := SHORT(Strings.Length(s))
  100.         END;
  101.     Files.WriteBytes(Output, s, j)
  102.   END PutSeq;
  103.  
  104.   PROCEDURE PutPP*(s: ARRAY OF CHAR);
  105.     VAR i, j: INTEGER;
  106.   BEGIN 
  107.     Wrap; 
  108.     Files.Write(Output, "#");
  109.     IF indlevel # 0 THEN i := IndWidth END;
  110.     WHILE i # indlevel DO Files.Write(Output, " "); INC(i) END;
  111.     Files.WriteBytes(Output, s, Strings.Length(s));
  112.     Wrap
  113.   END PutPP;
  114.  
  115.   PROCEDURE PutComment*(s: ARRAY OF CHAR);
  116.     VAR i: INTEGER;
  117.       str: ARRAY 4 OF CHAR;
  118.   BEGIN
  119.     i := 0;
  120.     str := "/* "; Files.WriteBytes(Output, str, Strings.Length(str));
  121.     WHILE s[i] # 0X DO
  122.       Files.Write(Output, s[i]);
  123.       IF (s[i] = "*") & (s[i+1] = "/") THEN Files.Write(Output, "@") END;
  124.       INC(i)
  125.     END;
  126.     str := " */"; Files.WriteBytes(Output, str, Strings.Length(str))
  127.   END PutComment;
  128.  
  129. BEGIN fold := FALSE; linenum := FALSE; macwrap := FALSE; unxwrap := TRUE
  130. END COCO.
  131.